<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    const data = [
      { 'id': '29', 'pid': '', 'name': '总裁办' },
      { 'id': '2c', 'pid': '', 'name': '财务部' },
      { 'id': '2d', 'pid': '2c', 'name': '财务核算部' },
      { 'id': '2f', 'pid': '2c', 'name': '薪资管理部' },
      { 'id': 'd2', 'pid': '', 'name': '技术部' },
      { 'id': 'd3', 'pid': 'd2', 'name': 'Java研发部' }
    ]

    const data1 = [
      { 'id': '29', 'pid': '', 'name': '总裁办', 'children': [] },
      {
        'id': '2c', 'pid': '', 'name': '财务部', 'children':
          [
            { 'id': '2d', 'pid': '2c', 'name': '财务核算部' },
            { 'id': '2f', 'pid': '2c', 'name': '薪资管理部' },
          ]
      },
      {
        'id': 'd2', 'pid': '', 'name': '技术部', 'children':
          [
            { 'id': 'd3', 'pid': 'd2', 'name': 'Java研发部' }
          ]
      },
    ]
    // 封装数组转树函数
    function arrayToTree(arr, pid) {
      // 筛选出pid为空的对象作为根数组
      const tree = arr.filter(item => item.pid === pid)
      // 遍历tree添加子节点
      tree.forEach(item => {
        // 通过递归将pid与顶层对象的id相同的对象添加进当前顶层对象的children子节点
        item.children = arrayToTree(arr, item.id)
      })
      return tree
    }
    // 调用函数传入需要转树的数组和初次为空的pid(为了先找到顶层数据对象)
    console.log(arrayToTree(data, ''))
  </script>
</body>

</html>